package com.leon.alishop.spider.spider;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.htmlparser.Parser;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.leon.alishop.core.enumeration.TaobaoStoreTypeEnum;
import com.leon.alishop.core.util.AliShopStringUtils;
import com.leon.alishop.model.ProviderInfo;
import com.leon.alishop.spider.config.SpiderProperties;
import com.leon.alishop.spider.model.TaobaoGoodsInfo;
import com.leon.alishop.spider.service.TaobaoGoodsServiceImpl;
import com.leon.alishop.spider.util.TaoBaoGoodsItemPageNodeParseUtil;
import com.leon.alishop.spider.util.NodeFilterUtil;
import com.leon.alishop.spider.util.ParserUtil;
import com.leon.alishop.spider.util.SpiderStringUtil;

public class CrawlTaobaoSpiderImpl implements CrawlTaobaoSpider {

	private static Logger log = LoggerFactory
			.getLogger(CrawlTaobaoSpiderImpl.class);

	@Override
	public List<String> crawlAllItemUrl(ProviderInfo pro) {
		if (pro == null)
			return Collections.emptyList();
		List<String> itemUrlList = new ArrayList<String>();
		Parser parser = null;
		String pageUrl = buildTaobaoStoreSearchUrl(pro.getTaobaoHomeUrl(),formatStoreType(pro.getStoreType())) ;
		NodeList nodeList = null;
		LinkTag _node;
		String _url;

		TaobaoStoreTypeEnum storeType;
		boolean firstPage = true;
		do {
			log.info("CrawlItemList:["+pro.getId()+"]"+pageUrl);
			storeType = formatStoreType(pro.getStoreType());
			// 访问页面
			try {
//				parser = new Parser(pageUrl);
				parser = ParserUtil.newParser(pageUrl);
				if(null == parser){
					log.error("[ProviderId:" + pro.getId() + "]无法访问的HomeUrl:"
							+ pageUrl);
					break;
				}
			}  catch (IOException e) {
				log.error("[ProviderId:" + pro.getId() + "]无法访问的HomeUrl:"
						+ pageUrl);
				break;
			}
			// 解析下一页的url
			try {
				nodeList = parser.parse(NodeFilterUtil
						.getNextPageFilter(storeType));
				parser.reset();
			} catch (ParserException e) {
				// crawlFailProviderMap.get(CrawlFailTypeEnum.PARSER_PAGE_ERROR).add(pro.getId());
				log.error("无法解析页码:" + pageUrl);
			}
			pageUrl = null;
			if (nodeList != null && nodeList.size() > 0) {
				for (int i = 0, len = nodeList.size(); i < len; i++) {
					_node = (LinkTag) nodeList.elementAt(i);
					_url = _node.getLink();
					if (null == _url) {
						continue;
					}
					pageUrl = _url;
					break;
				}
			}
			// 解析item url
			try {
				nodeList = parser.parse(NodeFilterUtil.getItemFilter(storeType));
				parser.reset();
			} catch (ParserException e) {
				// crawlFailProviderMap.get(CrawlFailTypeEnum.PARSER_ITEM_ERROR).add(pro.getId());
				log.error("[ProviderId:" + pro.getId() + "]解析商品列表出错");
			}
			if(firstPage 
					&& (nodeList == null || nodeList.size() ==0)
					&& (storeType == null || TaobaoStoreTypeEnum.VERSION_200X.equals(storeType))
					){
				// 尝试2012版本
				try {
					nodeList = parser.parse(NodeFilterUtil.getItemFilter(TaobaoStoreTypeEnum.VERSION_2012));
					parser.reset();
				} catch (ParserException e) {
					// crawlFailProviderMap.get(CrawlFailTypeEnum.PARSER_ITEM_ERROR).add(pro.getId());
					log.error("[ProviderId:" + pro.getId() + "]解析商品列表出错");
				}
				if(nodeList != null && nodeList.size()>0){
					pro.setStoreType(TaobaoStoreTypeEnum.VERSION_2012.ordinal());
				}
			}
			if (nodeList == null || nodeList.size() == 0) {
				// crawlFailProviderMap.get(CrawlFailTypeEnum.ITEM_EMPTY).add(pro.getId());
				log.error("[ProviderId:" + pro.getId() + "]商品列表为空！");
			} else {
				for (int i = 0, len = nodeList.size(); i < len; i++) {
					_node = (LinkTag) nodeList.elementAt(i);
					_url = _node.getLink();
					if (null == _url) {
						continue;
					}
					itemUrlList.add(_url);
				}
			}
			try {
				Thread.sleep(SpiderProperties.getCrawlDefaultSleepTime());
			} catch (InterruptedException e) {
				break;
			}
			firstPage = false;
//			break;
		} while (pageUrl != null);
		return itemUrlList;
	}

	private String buildTaobaoStoreSearchUrl(String taobaoHomeUrl,TaobaoStoreTypeEnum storeType){
		String orderType = TaobaoStoreTypeEnum.VERSION_2012.equals(storeType) ? "coefp_desc" : "_coefp";
		if(StringUtils.isNotBlank(taobaoHomeUrl)){
			if(taobaoHomeUrl.charAt(taobaoHomeUrl.length()-1) == '/')
				return taobaoHomeUrl + "search.htm?orderType="+orderType;
			return taobaoHomeUrl + "/" + "search.htm?orderType="+orderType;
		}
		return null;
	}
	
	@Override
	public List<TaobaoGoodsInfo> crawlItemUrl(ProviderInfo pro,
			List<String> itemUrlList) {
		if (null == itemUrlList || itemUrlList.size() == 0)
			return Collections.emptyList();
		Iterator<String> ite = itemUrlList.iterator();
		String goodsUrl;
		int size = itemUrlList.size();
		int cur = 1;
//		Parser parser = null;
		List<TaobaoGoodsInfo> goodsList = new ArrayList<TaobaoGoodsInfo>();
		TaobaoGoodsInfo _goods;
		while (ite.hasNext()) {
			goodsUrl = ite.next();
			log.info("CrawlItemInfo:["+pro.getId()+"--"+cur+"/"+size+"]"+goodsUrl);
			_goods = this.crawlItemUrlLoopIfFail(pro, goodsUrl, null);
			if(!TaobaoGoodsServiceImpl.isValidCrawlGoods(_goods)){
				log.error("Invalid crawl imte info:["+pro.getId()+"]:"+goodsUrl);
				cur++;
				continue;
			}
			goodsList.add(this.crawlItemUrlLoopIfFail(pro, goodsUrl, null));
//			// 访问页面
//			try {
////				parser = new Parser(goodsUrl);
//				parser = ParserUtil.newParser(goodsUrl);
//				if(parser == null){
//					log.error("[ProviderId:" + pro.getId() + "]无法访问的ItemUrl1:" + goodsUrl);
//					continue;
//				}
//			} catch (IOException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法访问的ItemUrl:"
//						+ goodsUrl);
//				continue;
//			}
//			_goods = new TaobaoGoodsInfo();
//			Map<String,String[]> paramsMap = SpiderStringUtil.parseRequestUrlParams(goodsUrl.toLowerCase());
//			try {
//				_goods.setProviderTaobaoGoodsId(Long.valueOf(paramsMap.get("id")[0]));
//			} catch (Exception e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析淘宝ItemId ItemUrl:"
//						+ goodsUrl);
//			}
//			// 解析缩略图
//			try {
//				_goods.setThumbnailUrls(GoodsItemPageNodeParseUtil.parseThumbnail(parser));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析小图ItemUrl:"
//						+ goodsUrl);
//			}
//
//			// 名称
//			try {
//				_goods.setProviderGoodsName(AliShopStringUtils.specCToUnicode(GoodsItemPageNodeParseUtil.parseName(parser)));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析名称ItemUrl:"
//						+ goodsUrl);
//			}
//			
//			// 价格
//			try {
//				_goods.setProviderGoodsPrice(GoodsItemPageNodeParseUtil.parsePrice(parser));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析价格ItemUrl:"
//						+ goodsUrl);
//			}
//			
//			// 销售量
//			try {
//				_goods.setProviderSaleVolume(GoodsItemPageNodeParseUtil.parseSaleVolume(parser));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析销售量ItemUrl:"
//						+ goodsUrl);
//			}
//			
//			// 浏览量
//			try {
//				_goods.setProviderViewNum(GoodsItemPageNodeParseUtil.parseViewNum(parser));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析浏览量ItemUrl:"
//						+ goodsUrl);
//			}
//			
//			// 收藏量
//			try {
//				_goods.setProviderFavNum(GoodsItemPageNodeParseUtil.parseFavNum(parser));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析收藏量ItemUrl:"
//						+ goodsUrl);
//			}
//			
//			// 解析属性
//			try {
//				_goods.setAttributeMap(GoodsItemPageNodeParseUtil.parseAttributes(parser));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析属性ItemUrl:"
//						+ goodsUrl);
//			}
//			
//			// 解析大图
//			try {
//				_goods.setBigImgUrls(GoodsItemPageNodeParseUtil.parseAjaxDescImg(parser));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析大图ItemUrl:"
//						+ goodsUrl);
//			}
//			
//			// 解析SKU
//			try {
//				_goods.setTaobaoGoodsSkuList(GoodsItemPageNodeParseUtil.parseSKU(parser));
//				parser.reset();
//			} catch (ParserException e) {
//				log.error("[ProviderId:" + pro.getId() + "]无法解析SKU ItemUrl:"
//						+ goodsUrl);
//			}
//			
//			goodsList.add(_goods);
			cur++;
			try {
				Thread.sleep(SpiderProperties.getCrawlDefaultSleepTime());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
//			if(cur == 3){
//				break;
//			}
		}
		return goodsList;
	}

	/**
	 * 循环爬取
	 * @param pro
	 * @param itemUrlList
	 * @param loop
	 */
	private TaobaoGoodsInfo crawlItemUrlLoopIfFail(ProviderInfo pro,String goodsUrl,Integer loop){
		Parser parser = null;
		TaobaoGoodsInfo _goods;
		int intLoop = loop == null ? SpiderProperties.getCrawlFailRetryTime() : loop.intValue();
		try {
//			parser = new Parser(goodsUrl);
			parser = ParserUtil.newParser(goodsUrl);
			if(parser == null){
				log.error("[ProviderId:" + pro.getId() + "]无法访问的ItemUrl1:" + goodsUrl);
				return null;
			}
		} catch (IOException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法访问的ItemUrl:"
					+ goodsUrl);
			return null;
		}
		_goods = new TaobaoGoodsInfo();
		Map<String,String[]> paramsMap = SpiderStringUtil.parseRequestUrlParams(goodsUrl.toLowerCase());
		try {
			_goods.setProviderTaobaoGoodsId(Long.valueOf(paramsMap.get("id")[0]));
		} catch (Exception e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析淘宝ItemId ItemUrl:"
					+ goodsUrl);
		}
		// 解析缩略图
		try {
			_goods.setThumbnailUrls(TaoBaoGoodsItemPageNodeParseUtil.parseThumbnail(parser));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析小图ItemUrl:"
					+ goodsUrl);
		}

		// 名称
		try {
			_goods.setProviderGoodsName(AliShopStringUtils.specCToUnicode(TaoBaoGoodsItemPageNodeParseUtil.parseName(parser)));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析名称ItemUrl:"
					+ goodsUrl);
			if(intLoop<=0){
				return null;
			}
			log.error("解析Item信息出错，重试"+intLoop+"\t[ProviderId:" + pro.getId() + "]\tItemUrl:" + goodsUrl);
			return crawlItemUrlLoopIfFail(pro, goodsUrl, intLoop--);
		}
		
		// 价格
		try {
			_goods.setProviderGoodsPrice(TaoBaoGoodsItemPageNodeParseUtil.parsePrice(parser));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析价格ItemUrl:"
					+ goodsUrl);
		}
		
		// 销售量
		try {
			_goods.setProviderSaleVolume(TaoBaoGoodsItemPageNodeParseUtil.parseSaleVolume(parser));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析销售量ItemUrl:"
					+ goodsUrl);
		}
		
		// 浏览量
		try {
			_goods.setProviderViewNum(TaoBaoGoodsItemPageNodeParseUtil.parseViewNum(parser));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析浏览量ItemUrl:"
					+ goodsUrl);
		}
		
		// 收藏量
		try {
			_goods.setProviderFavNum(TaoBaoGoodsItemPageNodeParseUtil.parseFavNum(parser));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析收藏量ItemUrl:"
					+ goodsUrl);
		}
		
		// 解析属性
		try {
			_goods.setAttributeMap(TaoBaoGoodsItemPageNodeParseUtil.parseAttributes(parser));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析属性ItemUrl:"
					+ goodsUrl);
		}
		
		// 解析大图
		try {
			_goods.setBigImgUrls(TaoBaoGoodsItemPageNodeParseUtil.parseAjaxDescImg(parser));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析大图ItemUrl:"
					+ goodsUrl);
		}
		
		// 解析SKU
		try {
			_goods.setTaobaoGoodsSkuList(TaoBaoGoodsItemPageNodeParseUtil.parseSKU(parser));
			parser.reset();
		} catch (ParserException e) {
			log.error("[ProviderId:" + pro.getId() + "]无法解析SKU ItemUrl:"
					+ goodsUrl);
		}
		return _goods;
	}
	
	private String checkValidGoods(TaobaoGoodsInfo goods){
		if(null == goods)
			return "商品为空！";
		if(StringUtils.isBlank(goods.getGoodsName()))
			return "名称为空！";
		if(goods.getGoodsPrice()==null)
			return "价格为空！";
		return null;
	}
	
	
	private static TaobaoStoreTypeEnum formatStoreType(Integer order){
		if(null == order)
			return null;
		return TaobaoStoreTypeEnum.valueOfOrdinal(order);
	}
	
}
